import { Callout } from "nextra-theme-docs";

# GZ::CTF

GZ::CTF は ASP.NET Core を基づいたオープンソース CTF プラットフォームで、コンテナバックエンドとして Docker または K8s を使用し、カスタマイズ可能なチャレンジ、動的コンテナ、および動的スコアリングを提供します。

このプロジェクトは、CTFd の実装は洗練されておらず、動的なコンテナ構成にはプラグインの使用が必要で、UI の見た目も良くないという欠点があって、それらを改善して、大会の開催をよりうまくできるために開発を始まりました。

GZ::CTF は AGPLv3 契約に基づいたオープンソースであり、その使用と変更はオープンソース契約に準拠する必要があります。 導入を開始するには、[クイックスタート](/ja/quick-start)を参照してください。

<Callout type="warning">

2024/01/01 より，`develop` ブランチから構築されたイメージのデータベーススキーマに破壊的変更が行われたため、従来のデータベースとの交換性はありません。従来のバージョンを引き続き使いたかった場合は `v0.17` を使ってください。

新しい機能の開発期間で `develop` イメージを生産環境にデプロイすることはお勧めしません。データ損失が発生する恐れがあります。

</Callout>

## 機能 🛠️

- 高度カスタマイズ可能なチャレンジを作れる

  - チャレンジ種類：静的アタッチメント、動的アタッチメント、静的コンテイナー、動的コンテイナー

    - 静的アタッチメント：アタッチメントは共有され、追加されたフラッグのどれも提出可能となります。
    - 動的アタッチメント：チーム数に応じたフラッグやアタッチメントが少なくとも必要となり、チームに応じてアタッチメントやフラッグが配布されます。
    - 静的コンテイナー：コンテナーのテンプレートは共有され、フラッグは発行されず、追加されたフラッグのどれも提出可能となります。
    - 動的コンテイナー：フラッグは自動的に生成され、コンテナ環境変数を通じて配布され、各チームのフラッグは一意です。

  - 動的スコアリング

    - スコアリングカーヴ：

      $$f(S, r, d, x) = \left \lfloor S \times \left[r  + ( 1- r) \times \exp\left( \dfrac{1 - x}{d} \right) \right] \right \rfloor $$

      このうち、 $S$ はオリジナルスコア、 $r$ は最低スコア率、 $d$ は難易度係数、 $x$ は提出数です。 最初の 3 つのパラメータは、ほとんどの動的なスコア要件を達成するためにカスタマイズできます。

    - ボーナス：
      プラットフォームは、ファーストブラッド、セカンドブラッドとサードブラッドに対して、それぞれポイントの 5%、3%、および 1% をボーナスとして与えます。

  - チャレンジはゲーム中に有効または無効にすることができ、複数回公開もできます。
  - 動的フラッグのチャレンジに対する不正検出機能、オプションのフラッグテンプレートとリートフラッグ機能

- **組織ごとにグループされたチーム**のスコアタイムライン、組織順位表
- **Docker または K8S** に基づいた動的なコンテナの分散、管理、および複数のポート マッピング方法のサポート
- SignalR に基づいた**リアルタイム**ゲーム通知、ゲームイベントとフラッグ送信とログの監視
- SMTPメール検証機能、Google ReCaptchav3による悪意のある登録防止
- ユーザーのブロックおよび権限管理
- オプションのチームレビュー、招待コード、登録メール制限
- プラットフォーム内での記事の収集、レビューとバッチダウンロード
- ランキングのダウンロードおよびエクスポート、すべての提出もダウンロードできます
- ゲーム中の審判監視、提出とメインイベントのログ
- チャレンジに対するトラフィック **TCP over WebSocket プロキシ転送**、トラフィック キャプチャの設定ができます
- Redis ベースのクラスター キャッシュ、PGSQL をデータベースとして使用
- Prometheus / OpenTelemetry に基づくデータトラッキングとモニタリング
- グローバル設定でプラットフォームタイトルと他の情報を設定可能
- その他...

## Stars ✨

[![Stargazers over time](https://starchart.cc/GZTimeWalker/GZCTF.svg?variant=adaptive)](https://starchart.cc/GZTimeWalker/GZCTF)

## Grafana 📊

![grafana.webp](/images/grafana.webp)

## Demo 🗿

![index.webp](/images/index.webp)

![game.challenges.webp](/images/game.challenges.webp)

![game.scoreboard.webp](/images/game.scoreboard.webp)

![admin.settings.webp](/images/admin.settings.webp)

![admin.challenges.webp](/images/admin.challenges.webp)

![admin.challenge.info.webp](/images/admin.challenge.info.webp)

![admin.challenge.flags.webp](/images/admin.challenge.flags.webp)

![admin.game.info.webp](/images/admin.game.info.webp)

![admin.game.review.webp](/images/admin.game.review.webp)

![admin.teams.webp](/images/admin.teams.webp)

![admin.instances.webp](/images/admin.instances.webp)

![monitor.game.events.webp](/images/monitor.game.events.webp)

![monitor.game.submissions.webp](/images/monitor.game.submissions.webp)
